home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / e / dclistview.lha / dclistview.e < prev    next >
Text File  |  1999-01-19  |  7KB  |  213 lines

  1. /*
  2.    Name:      dclistview.e
  3.    About:     A listview Plugin that understands double-clicks
  4.    Version:   $VER: dclistview.e 1.6 (19.1.99)
  5.    Author:    Copyright © 1997, 1998, 1999 Victor Ducedre.  All Rights Reserved.
  6.  
  7.    A brief note:  This version has been updated with the use of etaglist.m
  8.    from dev/e/SvensModules.lha.  eGetTagData() is the same as GetTagData()
  9.    from utility.library, but does not require the library.
  10.  
  11. */
  12. OPT MODULE
  13. OPT PREPROCESS
  14.  
  15. MODULE 'gadtools', 'libraries/gadtools', 'devices/inputevent',
  16.        'intuition/gadgetclass', 'intuition/intuition', 'utility/tagitem',
  17.        'tools/EasyGUI', 'tools/textlen', 'tools/ctype', 'exec/nodes',
  18.        'exec/lists', 'sven/support/etaglist', 'graphics/text'
  19.  
  20. ->define DCLIST to make EasyGUI's gadget list more readable!
  21. EXPORT CONST DCLIST=PLUGIN
  22.  
  23. EXPORT ENUM DCLV_LABEL=$FF000001,           -> [I..]
  24.             DCLV_RELX,                      -> [I..]
  25.             DCLV_RELY,                      -> [I..]
  26.             DCLV_LIST,                      -> [ISG]
  27.             DCLV_CURRENT,                   -> [ISG]
  28.             DCLV_CLICK,                     -> [..G]
  29.             DCLV_TOP,                       -> [ISG]
  30.             DCLV_DISABLED,                  -> [ISG]
  31.             DCLV_TEXTATTR,                  -> [I..]
  32.             DCLV_USEARROWS                  -> [I..]
  33.  
  34. EXPORT OBJECT dclistview OF plugin PRIVATE
  35.   disabled
  36.   current
  37.   top
  38.   clicked
  39.   gadget:PTR TO gadget
  40.   label
  41.   labelhi
  42.   relx, rely
  43.   execlist
  44.   maxnode
  45.   key
  46.   second1, micros1
  47.   second2, micros2
  48.   textattr:PTR TO textattr
  49.   cursor
  50. ENDOBJECT
  51.  
  52. PROC dclistview(tags:PTR TO tagitem) OF dclistview
  53. DEF key,label
  54. -> eGetTagData() is from sven/support/etaglist.  See docs.
  55.   self.label:=      eGetTagData(DCLV_LABEL,     NIL, tags)
  56.   self.relx :=  Max(eGetTagData(DCLV_RELX,        5, tags), 5)
  57.   self.rely :=  Max(eGetTagData(DCLV_RELY,        5, tags), 2)
  58.   self.execlist:=   eGetTagData(DCLV_LIST,      NIL, tags)
  59.   self.maxnode:=    max_node(self.execlist)
  60.   self.current:=Max(eGetTagData(DCLV_CURRENT,   NIL, tags), -1)
  61.   self.top:=    Max(eGetTagData(DCLV_TOP,       NIL, tags),0)
  62.   self.disabled:=   eGetTagData(DCLV_DISABLED,FALSE, tags)
  63.   self.cursor:=     eGetTagData(DCLV_USEARROWS,FALSE, tags)
  64.   IF self.cursor
  65.     self.key:=NIL
  66.   ELSEIF label:=self.label
  67.     self.key:= IF (key:=InStr(label, '_'))<>-1 THEN tolower(label[key+1]) ELSE NIL
  68.     self.key:= IF isalpha(self.key) THEN self.key ELSE NIL
  69.   ENDIF
  70.   self.textattr:=   eGetTagData(DCLV_TEXTATTR,  NIL, tags)
  71.   self.second1:=NIL;  self.second2:=NIL
  72.   self.micros1:=NIL;  self.micros2:=NIL
  73. ENDPROC
  74.  
  75. PROC end() OF dclistview IS EMPTY
  76.  
  77. PROC min_size(ta,fh) OF dclistview
  78.   IF self.textattr THEN fh:=self.textattr.ysize
  79.   self.labelhi:=IF self.label THEN fh+5 ELSE 0
  80. ENDPROC Max(textlen_key(self.label,ta,self.key),self.relx*fh), self.rely*fh+self.labelhi+5
  81.  
  82. PROC will_resize() OF dclistview IS (RESIZEX OR RESIZEY)
  83.  
  84. PROC gtrender(gl,vis,ta,x,y,xs,ys,w) OF dclistview HANDLE
  85.  
  86.   self.gadget:=CreateGadgetA(LISTVIEW_KIND,gl,
  87.                  [x,y+self.labelhi,xs,ys-self.labelhi,self.label,
  88.                   IF self.textattr THEN self.textattr ELSE ta,0,0,vis,NIL]:newgadget,
  89.                  [GTLV_LABELS, self.execlist,
  90.                   GA_DISABLED, self.disabled,
  91.                   IF self.key THEN GT_UNDERSCORE ELSE TAG_IGNORE, "_",
  92.                   GTLV_SHOWSELECTED, NIL,
  93.                   GTLV_SELECTED, self.current,
  94.                   GTLV_TOP, self.top,
  95.                   TAG_DONE])
  96.   IF self.gadget=NIL THEN Raise("dclv")
  97. EXCEPT DO
  98.   ReThrow()
  99. ENDPROC self.gadget
  100.  
  101. PROC message_test(imsg:PTR TO intuimessage,win:PTR TO window) OF dclistview
  102. DEF islist=FALSE
  103. IF Not(self.disabled)
  104.   IF (imsg.class=IDCMP_VANILLAKEY) THEN RETURN (self.key=tolower(imsg.code))
  105.   IF (imsg.class=IDCMP_RAWKEY) AND (self.cursor) THEN RETURN ((imsg.code=CURSORUP) OR (imsg.code=CURSORDOWN))
  106. ENDIF
  107. IF (imsg.class=IDCMP_GADGETUP)
  108.   IF islist:= (imsg.iaddress=self.gadget)
  109.     self.second2:=imsg.seconds
  110.     self.micros2:=imsg.micros
  111.   ENDIF
  112. ENDIF
  113. ENDPROC islist
  114.  
  115. PROC message_action(class,qual,code,win:PTR TO window) OF dclistview
  116. DEF newcurrent, altused
  117. SELECT class
  118.   CASE IDCMP_RAWKEY
  119.     SELECT code
  120.       altused:=(qual AND (IEQUALIFIER_LALT OR IEQUALIFIER_RALT))
  121.       CASE CURSORUP
  122.         newcurrent:=IF altused THEN 0 ELSE Max(self.current-1, 0)
  123.       CASE CURSORDOWN
  124.         newcurrent:=IF altused THEN self.maxnode ELSE Min(self.current+1, self.maxnode)
  125.     ENDSELECT
  126.     IF newcurrent=self.current THEN RETURN FALSE ELSE self.current:=newcurrent
  127.     self.set(DCLV_CURRENT, self.current)
  128.   CASE IDCMP_VANILLAKEY
  129.     IF (qual AND (IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))
  130.       newcurrent:=Max(self.current-1, 0)
  131.     ELSE
  132.       newcurrent:=Min(self.current+1, self.maxnode)
  133.     ENDIF
  134.     IF newcurrent=self.current THEN RETURN FALSE ELSE self.current:=newcurrent
  135.     self.set(DCLV_CURRENT, self.current)
  136.   CASE IDCMP_GADGETUP
  137.     IF code=self.current
  138.       self.clicked:=(IF self.clicked THEN FALSE ELSE DoubleClick(self.second1,self.micros1,self.second2,self.micros2))
  139.     ELSE
  140.       self.current:=code
  141.       self.clicked:=FALSE
  142.     ENDIF
  143. ENDSELECT
  144.   self.second1:=self.second2;  self.second2:=NIL
  145.   self.micros1:=self.micros2;  self.micros2:=NIL
  146. ENDPROC TRUE
  147.  
  148. PROC set(attr, val) OF dclistview IS self.setA([attr, val, TAG_DONE])
  149.  
  150. PROC setA(tags:PTR TO LONG) OF dclistview
  151. DEF newattr=NIL, attr, val, vers, newtop
  152.  
  153.   vers:=KickVersion(39)
  154.   WHILE (attr:=Long(tags++))
  155.     val:=Long(tags++)
  156.     SELECT attr
  157.       CASE DCLV_DISABLED
  158.         IF vers
  159.           IF self.disabled<>val
  160.             self.disabled:=val
  161.             newattr:=NEW [GA_DISABLED, self.disabled, TAG_DONE]
  162.             self.clicked:=FALSE
  163.           ENDIF
  164.         ENDIF
  165.       CASE DCLV_LIST
  166.         self.maxnode:=max_node(val)
  167.         newattr:=NEW [GTLV_LABELS, val, TAG_DONE]
  168.         self.execlist:=val
  169.         self.clicked:=FALSE
  170.       CASE DCLV_TOP
  171.         self.top:=Bounds(val,0,self.maxnode)
  172.         newattr:=NEW [GTLV_TOP, self.top, TAG_DONE]
  173.       CASE DCLV_CURRENT
  174.         self.current:= Bounds(val,-1,self.maxnode)
  175.         newattr:=NEW [GTLV_SELECTED, self.current,
  176.                       IF vers THEN GTLV_MAKEVISIBLE ELSE GTLV_TOP, Max(self.current,0),
  177.                       TAG_DONE]
  178.         IF vers
  179.           Gt_GetGadgetAttrsA(self.gadget, self.gh.wnd,NIL, [GTLV_TOP, {newtop}, TAG_DONE])
  180.         ELSE
  181.           newtop:=Max(self.current,0)
  182.         ENDIF
  183.         self.top:=newtop
  184.         self.clicked:=FALSE
  185.     ENDSELECT
  186.     IF newattr
  187.       IF visible(self) THEN Gt_SetGadgetAttrsA(self.gadget, self.gh.wnd, NIL, newattr)
  188.       FastDisposeList(newattr)
  189.     ENDIF
  190.   ENDWHILE
  191. ENDPROC
  192.  
  193. PROC get(attr) OF dclistview
  194.   SELECT attr
  195.     CASE DCLV_LIST;     RETURN self.execlist, TRUE
  196.     CASE DCLV_CURRENT;  RETURN self.current,  TRUE
  197.     CASE DCLV_TOP;      RETURN self.top,      TRUE
  198.     CASE DCLV_CLICK;    RETURN self.clicked,  TRUE
  199.     CASE DCLV_DISABLED; RETURN self.disabled, TRUE
  200.   ENDSELECT
  201. ENDPROC -1, FALSE
  202.  
  203. PROC visible(self:PTR TO dclistview) IS (self.gadget)AND(self.gh.wnd)
  204.  
  205. PROC max_node(list:PTR TO lh)
  206. DEF node=NIL:PTR TO ln, i=-1
  207.   IF list>0
  208.     node:=list.head
  209.     WHILE node:=node.succ DO INC i
  210.   ENDIF
  211. ENDPROC i
  212.  
  213.